{"cells": [{"cell_type": "markdown", "id": "7aa279f9", "metadata": {}, "source": ["# Devoir Maison - Calcul des dates\n", "\n", "Dans cette exercice, nous allons \u00e9crire des fonctions pour traiter des dates. Il est interdit d'utiliser la librairie python \"datetime\" ou tout autre librairie permettant de traiter les dates automatiquement. \n", "\n", "Pour simplifier l'exercice, nous consid\u00e9rerons que le calendrier est inchang\u00e9 depuis son origine. Nous rappelons que les ann\u00e9es bisextiles ont lieu tous les 4 ans, sauf tous les 100 ans, sauf tous les 400 ans. Ainsi, 1900, n'\u00e9tait pas bisextile, mais 2000 l'\u00e9tait.\n", "\n", "Le calendrier comment le 1er janvier de l'an I (il n'y a pas de zero du mois zero de l'an zero). C'est le premier jour du calendrier. \n", "\n", "Afin de vous aider, j'ai indiqu\u00e9 le r\u00e9sultat d'un certain nombre de fonction. Il faudra tester votre code avec mes examples.\n", "\n", "J'ai pris ma date de naissance pour une exemple de date, merci d'indiquer la votre en d\u00e9but de fichier (la mienne est le 11 f\u00e9vrier 1980)."]}, {"cell_type": "markdown", "id": "fa65e40e", "metadata": {}, "source": ["## Ann\u00e9es bisextiles\n"]}, {"cell_type": "markdown", "id": "d1fce3af", "metadata": {}, "source": ["1. \u00c9crire une fonction qui prend l'ann\u00e9e comme argument et renvoie True ou False suivant que l'ann\u00e9e est bisextile ou pas. "]}, {"cell_type": "code", "execution_count": 2, "id": "0aaa66f9", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["True\n", "True\n", "False\n", "False\n"]}], "source": ["print(est_bisextile(2024))\n", "print(est_bisextile(2000))\n", "print(est_bisextile(2021))\n", "print(est_bisextile(1900))"]}, {"cell_type": "markdown", "id": "60c98ca7", "metadata": {}, "source": ["2. \u00c9crire une fonction qui \u00e0 partir de l'ann\u00e9e renvoie le nombre de jour \u00e9coul\u00e9s jusqu'au premier janvier de cette ann\u00e9e. Cette fonction renverra donc 0 pour l'an 1, 365 pour l'an 2, $3\\times365$ pour l'an 4, $4\\times365+1$ pour l'an 5. Pour l'an 101, ce sera $100\\times 365 + 24$, etc... "]}, {"cell_type": "code", "execution_count": 4, "id": "b6d8ba99", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["0\n", "365\n", "1095\n", "36524\n", "146097\n"]}], "source": ["print(nombres_jours_annees_precedentes(1))\n", "print(nombres_jours_annees_precedentes(2))\n", "print(nombres_jours_annees_precedentes(4))\n", "print(nombres_jours_annees_precedentes(101))\n", "print(nombres_jours_annees_precedentes(401))"]}, {"cell_type": "markdown", "id": "3c184623", "metadata": {}, "source": ["3. \u00c9crire une fonction qui a partir du chiffre du mois (janvier=1, f\u00e9vrier=2, ...) et du jour du mois renvoie le nombre de jour \u00e9coul\u00e9 depuis le premier janvier de cette ann\u00e9e. Cette fonction prendra un argument optionnel qui indique si l'ann\u00e9e est bisextile. "]}, {"cell_type": "code", "execution_count": 6, "id": "204bae8e", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["0\n", "364\n", "70\n"]}], "source": ["print(nombre_jours_depuis_premier_janvier(jour=1, mois=1, bisextile=False))\n", "print(nombre_jours_depuis_premier_janvier(jour=31, mois=12, bisextile=False))\n", "print(nombre_jours_depuis_premier_janvier(jour=11, mois=3, bisextile=True))"]}, {"cell_type": "markdown", "id": "a1f38b71", "metadata": {}, "source": ["4. Si ce n'est pas d\u00e9j\u00e0 le cas, \u00e9crire la fonction pr\u00e9c\u00e9dente \u00e0 l'aide d'une liste qui contiendra le nombre de jours successif de chaque mois (31, 28, 31, 30, 31, ...)"]}, {"cell_type": "code", "execution_count": 7, "id": "54374f06", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["jours_par_mois_normal = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n", "jours_par_mois_bisextile = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]"]}, {"cell_type": "markdown", "id": "c2636529", "metadata": {}, "source": ["5. \u00c9crire une fonction qui prend comme argument la date sous forme de nombre et renvoie le nombre de jours \u00e9coul\u00e9s depuis le premier janvier de l'an I. Cette fonction utilisera bien entendu les fonctions \u00e9crites pr\u00e9c\u00e9dement ! Combien de jour se sont \u00e9coul\u00e9s entre le 1/1/1 et votre date de naissance ?"]}, {"cell_type": "code", "execution_count": 9, "id": "46aff740", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["0\n", "722855\n"]}], "source": ["print(nombre_de_jours(1, 1, 1))\n", "print(nombre_de_jours(annee=1980, mois=2, jour=11))"]}, {"cell_type": "markdown", "id": "83328e20", "metadata": {}, "source": ["## Programmation orient\u00e9e objet\n", "\n", "Dans ce qui suit, merci de toujours tester vos fonctions/m\u00e9thodes avec ma date de naissance (le 11 f\u00e9vrier 1980) et la v\u00f4tre. \n", "\n", "5. D\u00e9finir un objet `Date` qui s'initialise avec trois arguments (ann\u00e9e, jour, mois).\n", "\n", "6. Ajouter une m\u00e9thode `__repr__` qui renvoie la cha\u00eene de caract\u00e8re permettant de cr\u00e9er l'objet. \n", "\n", "7. Ajouter une m\u00e9thode `__str__` qui renvoie la date sous forme humaine (\"14 juillet 1789\"). Le nom des mois sera rentr\u00e9 sous forme d'une liste "]}, {"cell_type": "code", "execution_count": 10, "id": "5fbb42f1", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["nom_mois = [\n", " \"janvier\",\"f\u00e9vrier\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"ao\u00fbt\",\"septembre\",\"octobre\",\n", " \"novembre\",\"d\u00e9cembre\"\n", "]"]}, {"cell_type": "code", "execution_count": 12, "id": "014e0571", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["11 f\u00e9vrier 1980\n"]}, {"data": {"text/plain": ["Date(annee=1980, mois=2, jour=11)"]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["ma_date_de_naissance = Date(1980, 2, 11)\n", "\n", "print(ma_date_de_naissance)\n", "ma_date_de_naissance"]}, {"cell_type": "markdown", "id": "1d2f3787", "metadata": {}, "source": ["8. Ajouter une m\u00e9thode qui renvoie le nombre de jour \u00e9coul\u00e9s depuis le premier janvier de l'an I. \n", "\n", "9. En utilisant la m\u00e9thode de la question pr\u00e9c\u00e9dente, d\u00e9finir la m\u00e9thode sp\u00e9ciale `__sub__` qui renvoie le nombre de jour qui s'est \u00e9coul\u00e9 entre deux dates donn\u00e9es. "]}, {"cell_type": "code", "execution_count": 14, "id": "c17217e4", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["722855\n", "16177\n"]}], "source": ["ma_date_de_naissance = Date(1980, 2, 11)\n", "\n", "aujourdhui = Date(2024, 5, 27)\n", "\n", "print(ma_date_de_naissance.nombre_de_jours())\n", "\n", "age = aujourdhui - ma_date_de_naissance\n", "print(age)"]}, {"cell_type": "markdown", "id": "adb4dfc7", "metadata": {}, "source": ["10. \u00c9crire une m\u00e9thode qui renvoie le jour de la semaine sous forme d'un nombre (lundi->0, mardi->1, ...) et une autre m\u00e9thode qui renvoie ce jour sous forme d'une cha\u00eene de caract\u00e8re."]}, {"cell_type": "code", "execution_count": 16, "id": "2e2d2a9e", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["0\n", "lundi\n", "lundi 11 f\u00e9vrier 1980\n"]}], "source": ["ma_date_de_naissance = Date(1980, 2, 11)\n", "\n", "\n", "print(ma_date_de_naissance.jour_semaine_nombre())\n", "print(ma_date_de_naissance.jour_semaine_str())\n", "print(ma_date_de_naissance)"]}, {"cell_type": "markdown", "id": "29b7eb78", "metadata": {}, "source": ["## Manipulation de cha\u00eenes de caract\u00e8res\n", "\n", "Dans les questions suivantes, il est conseill\u00e9 d'utiliser la m\u00e9thode split des cha\u00eenes de caract\u00e8res.\n", "\n", "11. \u00c9crire une fonction qui \u00e0 partir d'une chaine de caract\u00e8re du type `\"11/02/1890\"` renvoie les trois nombres du jours, du mois et de l'ann\u00e9e.\n", "\n", "12. \u00c9crire une fonction qui cr\u00e9er un objet `Date` \u00e0 partir d'une telle chaine de caract\u00e8re. "]}, {"cell_type": "code", "execution_count": 18, "id": "3476e505", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["(11, 2, 1980)\n"]}, {"data": {"text/plain": ["Date(annee=1980, mois=2, jour=11)"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["print(split_date(\"11/02/1980\"))\n", "date_from_str(\"11/02/1980\")"]}, {"cell_type": "markdown", "id": "be00b37b", "metadata": {}, "source": ["13. M\u00eames questions, mais avec une date du type \"11 f\u00e9vrier 1980\". La conversion de nom du mois vers le num\u00e9ro sera faite gr\u00e2ce \u00e0 un dictionnaire : `{\"janvier\":1, \"f\u00e9vrier\":2, ...}`\n", "\n", "14. Cr\u00e9er le dictionnaire pr\u00e9c\u00e9dent \u00e0 l'aide d'une boucle for \u00e0 partir de la liste des mois. "]}, {"cell_type": "code", "execution_count": 20, "id": "6844ff57", "metadata": {"tags": ["keep", "dispres"]}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["(11, 2, 1980)\n"]}, {"data": {"text/plain": ["Date(annee=1980, mois=2, jour=11)"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["print(split_explicit_date(\"11 f\u00e9vrier 1980\"))\n", "date_from_explicit_str(\"11 f\u00e9vrier 1980\")"]}, {"cell_type": "markdown", "id": "09f83e7f", "metadata": {}, "source": ["## Statistiques sur les jours de la semaine\n", "\n", "15. Le calendrier a une p\u00e9riode de 400 ans, soit en tout 4800 mois. Pour chacun de ces mois, calculer le jour de la semaine o\u00f9 tombe le 13. Montrer que le 13 a le plus de chance de tomber un vendredi."]}, {"cell_type": "markdown", "id": "fda7e498", "metadata": {}, "source": ["## Insee\n", "\n", "L'insee publie les donn\u00e9es sur les personnes d\u00e9c\u00e9d\u00e9es r\u00e9guli\u00e8rement. Elle se trouvent sur la page suivante : https://www.insee.fr/fr/information/4769950 \n", "\n", "T\u00e9l\u00e9chargez le fichier correspondant \u00e0 votre ann\u00e9e de naissance. Utiliser la commange `pandas.read_csv` pour l'ouvrir (avec l'option `delimiter=';'`)\n", "\n", "Les dates sont enregistr\u00e9e sous la forme d'un nombre dont l'\u00e9criture d\u00e9cimale correspond \u00e0 AAAAMMJJ, o\u00f9 AAAA est l'ann\u00e9e, MM le mois et JJ le jour. \n", "\n", "16. Calculer l'age en jour de toutes les personnes d\u00e9c\u00e9s cette ann\u00e9e l\u00e0. \n", "\n", "17. Calculer l'age moyen des d\u00e9c\u00e9s.\n", "\n", "18. Comment s'appelle la personne la plus ag\u00e9e qui est d\u00e9c\u00e9d\u00e9e, quel est son age ?\n", "\n", "19. Tracer l'histogramme de l'age au moment du d\u00e9c\u00e9s"]}, {"cell_type": "markdown", "id": "1ca1a69c", "metadata": {}, "source": ["![Texte alternatif](histogramme.jpg \"Titre de l'image\")"]}], "metadata": {"celltoolbar": "Tags", "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8"}, "varInspector": {"cols": {"lenName": 16, "lenType": 16, "lenVar": 40}, "kernels_config": {"python": {"delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())"}, "r": {"delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) "}}, "types_to_exclude": ["module", "function", "builtin_function_or_method", "instance", "_Feature"], "window_display": false}}, "nbformat": 4, "nbformat_minor": 5}